/**
 * Copyright 2013 Ministerio de Industria, EnergÃ­a y Turismo
 *
 * Este fichero es parte de "Componentes de Firma XAdES 1.1.7".
 *
 * Licencia con arreglo a la EUPL, VersiÃ³n 1.1 o â€“en cuanto sean aprobadas por la ComisiÃ³n Europeaâ€“ versiones posteriores de la EUPL (la Licencia);
 * Solo podrÃ¡ usarse esta obra si se respeta la Licencia.
 *
 * Puede obtenerse una copia de la Licencia en:
 *
 * http://joinup.ec.europa.eu/software/page/eupl/licence-eupl
 *
 * Salvo cuando lo exija la legislaciÃ³n aplicable o se acuerde por escrito, el programa distribuido con arreglo a la Licencia se distribuye Â«TAL CUALÂ»,
 * SIN GARANTÃ�AS NI CONDICIONES DE NINGÃšN TIPO, ni expresas ni implÃ­citas.
 * VÃ©ase la Licencia en el idioma concreto que rige los permisos y limitaciones que establece la Licencia.
 */
package es.mityc.javasign.xades.examples.signformats;

import org.w3c.dom.Document;

import es.mityc.firmaJava.libreria.xades.DataToSign;
import es.mityc.firmaJava.libreria.xades.XAdESSchemas;
import es.mityc.firmaJava.role.SimpleClaimedRole;
import es.mityc.javasign.EnumFormatoFirma;
import es.mityc.javasign.certificate.ocsp.OCSPLiveConsultant;
import es.mityc.javasign.trust.TrustAbstract;
import es.mityc.javasign.trust.TrustFactory;
import es.mityc.javasign.ts.HTTPTimeStampGenerator;
import es.mityc.javasign.ts.TSPAlgoritmos;
import es.mityc.javasign.xades.examples.GenericXMLSignature;
import es.mityc.javasign.xml.refs.AllXMLToSign;
import es.mityc.javasign.xml.refs.ObjectToSign;

/**
 * <p>
 * Clase de ejemplo para la firma XAdES-C enveloped de un documento
 * </p>
 * <p>
 * Para realizar la firma se utilizarÃ¡ el almacÃ©n PKCS#12 definido en la
 * constante <code>GenericXMLSignature.PKCS12_FILE</code>, al que se accederÃ¡
 * mediante la password definida en la constante
 * <code>GenericXMLSignature.PKCS12_PASSWORD</code>. El directorio donde quedarÃ¡
 * el archivo XML resultante serÃ¡ el indicado en al constante
 * <code>GenericXMLSignature.OUTPUT_DIRECTORY</code>
 * </p>
 * 
 */
public class XAdESCSignature extends GenericXMLSignature {

    /**
     * <p>
     * Nombre del validador de confianza a utilizar
     * </p>
     */
    private final static String TRUSTER_NAME = "my";
	

    /**
     * <p>
     * Recurso a firmar
     * </p>
     */
    private final static String RESOURCE_TO_SIGN = "/examplessura/ExampleToSign.xml";

    /**
     * <p>
     * Fichero donde se desea guardar la firma
     * </p>
     */
    private final static String SIGN_FILE_NAME = "SURAXAdES-C-Sign.xml";

    /**
     * <p>
     * URL de una TSA para poder hacer el sellado de tiempo
     * </p>
     */
   // private final static String URL_TSA = "http://tsa.safecreative.org";
   // private final static String URL_TSA = "http://ca.signfiles.com/tsa/get.aspx";
    private final static String URL_TSA = "http://webiisdesa01:8024/tsa40/get.aspx";
   // private final static String URL_TSA = "http://services.globaltrustfinder.com/adss/tsa";
    //private final static String URL_TSA = "http://pilot-timestamp.esign-la.com/tsa?workerName=TimeStampSigner";
    
    
    /**
     * <p>
     * URL de un OCSP para hacer las validaciones de los certificados
     * </p>
     */
   // private final static String URL_OCSP = "http://ocsp.camerfirma.com";
   // private final static String URL_OCSP ="http://ocsp.globaltrustfinder.com";
    //private final static String URL_OCSP ="http://onsite-ocsp.verisign.com";
    private final static String URL_OCSP ="http://ocsp.acepta.com/FirmaAvanzadaV2";

    /**
     * <p>
     * Punto de entrada al programa
     * </p>
     * 
     * @param args
     *            Argumentos del programa
     */
    public static void main(String[] args) {
        XAdESCSignature signature = new XAdESCSignature();
        signature.execute();
    }

    @Override
    protected DataToSign createDataToSign() {
        DataToSign dataToSign = new DataToSign();
        dataToSign.setXadesFormat(EnumFormatoFirma.XAdES_C);
        // Validador de confianza de certificados
       TrustAbstract truster = TrustFactory.getInstance().getTruster(TRUSTER_NAME);
        
       if (truster == null) {
        	
            System.out.println("No se ha encontrado el validador de confianza");
            System.exit(-1);
            
        }
        
        // Se establece el validador OCSP a utilizar
        dataToSign.setCertStatusManager(new OCSPLiveConsultant(URL_OCSP, truster));
       // dataToSign.setCertStatusManager(new CRLLiveICertStatusRecoverer());
       // Se establece el generador de sellos de tiempo a utilizar
       dataToSign.setTimeStampGenerator(new HTTPTimeStampGenerator(URL_TSA, TSPAlgoritmos.SHA1));  
        
        dataToSign.setEsquema(XAdESSchemas.XAdES_132);
        dataToSign.setXMLEncoding("UTF-8");
        dataToSign.setEnveloped(true);
        // Se aÃ±ade un rol de firma
        dataToSign.addClaimedRol(new SimpleClaimedRole("Rol de firma"));
        dataToSign.addObject(new ObjectToSign(new AllXMLToSign(), "Documento de ejemplo", null, "text/xml", null));
        Document docToSign = getDocument(RESOURCE_TO_SIGN);
        dataToSign.setDocument(docToSign);
        return dataToSign;

    }

    @Override
    protected String getSignatureFileName() {
        return SIGN_FILE_NAME;
    }

}
